#include "volumetool.h"
#include "ui_volumetool.h"
#include<QGraphicsDropShadowEffect>
#include<QPainter>
#include<QPolygon>

///////////////////////////////////////////
//右侧界面中的音量控制键//////////////////////
//////////////////////////////////////////

VolumeTool::VolumeTool(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::VolumeTool),
    volumeRatio(20),
    isMuted(false)
{
    ui->setupUi(this);
    //设置窗口为弹出窗口，且窗口无边框,窗口无阴影
    this->setWindowFlags(Qt::Popup|Qt::FramelessWindowHint|Qt::NoDropShadowWindowHint);

    //设置窗口背景透明
    // 在windows上，设置透明效果后，窗⼝需要加上Qt::FramelessWindowHint格式,否则没有控件位置的背景是⿊⾊的
    // 由于默认窗⼝有阴影，因此还需要将窗⼝的原有的阴影去掉，窗⼝需要加上Qt::NoDropShadowWindowHint
    this->setAttribute(Qt::WA_TranslucentBackground);   //设置窗口背景透明

    //自定义阴影效果-->Qt提供的QGraphicsDropShadowEffect类实现
    QGraphicsDropShadowEffect* dropShadow=new QGraphicsDropShadowEffect(this);
    dropShadow->setOffset(0,0);
    dropShadow->setBlurRadius(10);
    dropShadow->setColor("#646464");
    this->setGraphicsEffect(dropShadow);

    //音量按钮设置图标
    ui->silenceBtn->setIcon(QIcon(":/image/volume.png"));
    //设置默认音量为20%
    ui->volumeRatio->setText("20%");    //设置文本
    ui->outSlider->setGeometry(ui->outSlider->x(),180-36+25,ui->outSlider->width(),36);      //设置outline的尺寸(坐标和高度),25是上方outline距离父元素上方发距离
    ui->sliderBtn->move(ui->sliderBtn->x(),ui->outSlider->y() - ui->sliderBtn->height()/2);  //设置按钮的坐标
    ui->sliderBox->installEventFilter(this);    //给滑杆调节音量区域安装事件过滤器(如果要对某一控件进行事件过滤,则要对该控件安装事件过滤器)
    //静音/非静音按钮被点击发送的信号和相关槽函数相关联
    connect(ui->silenceBtn,&QPushButton::clicked,this,&VolumeTool::onSilenceBtnClicked);
}

VolumeTool::~VolumeTool()
{
    delete ui;
}

//通过滑杆修改音量的处理函数-->计算音量大小,更新outLine的高低,更新sliderBtn的位置,更新音量百分比显示
void VolumeTool::setVolume()
{
    //获取鼠标相对sliderBox的纵坐标
    int height=ui->sliderBox->mapFromGlobal(QCursor().pos()).y();//mapFromGlobal()方法转化全局坐标到一个widget坐标,QCursor表示光标类

    //验证height的合法性
    height=height<25?25:height;
    height=height>205?205:height;

    //设置outLine的位置信息
    ui->outSlider->setGeometry(ui->outSlider->x(),height,ui->outSlider->width(),205-height);
    //设置按钮的坐标
    ui->sliderBtn->move(ui->sliderBtn->x(),ui->outSlider->y() - ui->sliderBtn->height()/2);
    //计算音量的大小
    volumeRatio=(int)(ui->outSlider->height()/(float)180*100);
    //设置显示音量的大小标签
    ui->volumeRatio->setText(QString::number(volumeRatio)+"%");
}

//点击静音/非静音按钮的处理函数-->切换静音/非静音的图片,并发送信号进行处理
void VolumeTool::onSilenceBtnClicked()
{
    isMuted=!isMuted;
    if(isMuted)
    {
        ui->silenceBtn->setIcon(QIcon(":/image/silence.png"));
    }
    else
    {
        ui->silenceBtn->setIcon(QIcon(":/image/volume.png"));
    }
    //发射信号让qqmusic处理
    emit setSilence(isMuted);
}

//在绘图事件中绘制volumeTool界面下的三角
void VolumeTool::paintEvent(QPaintEvent *event)
{
    (void)event;
    //设置绘图对象(同时设置画布)
    QPainter painter(this);
    //设置画笔,没有画笔时：画出来的图形就没有边框和轮廓线
    painter.setPen(Qt::NoPen);
    //设置画刷颜色
    painter.setBrush(Qt::white);

    //创建一个三角形
    QPolygon polygon;
    polygon.append(QPoint(10+10,300));
    polygon.append(QPoint(10+10+60,300));
    polygon.append(QPoint(10+10+30,300+20));

    //绘制三角形
    painter.drawPolygon(polygon);

}

//事件拦截函数(用于处理鼠标按下,鼠标释放,鼠标移动而导致音量调节的事件)
bool VolumeTool::eventFilter(QObject *object, QEvent *event)
{
    //对控件sliderBox(滑杆区域)进行事件拦截
    if(object==ui->sliderBox)
    {
        if(event->type()==QEvent::MouseButtonPress)     //对鼠标按下事件进行拦截
        {
            //计算音量大小并更改音量调节窗口的显示
            setVolume();
        }
        else if(event->type()==QEvent::MouseMove)       //对鼠标移动事件进行拦截
        {
            //计算音量大小并更改音量调节窗口的显示
            setVolume();
            //发送更改音量信号
            emit setMusicVolume(volumeRatio);
        }
        else if(event->type()==QEvent::MouseButtonRelease)  //对鼠标释放事件进行拦截
        {
            //发送更改音量信号(鼠标释放时只需要修改媒体音量为当前记录的音量即可)
            emit setMusicVolume(volumeRatio);
        }
        return true;
    }
    //没有处理事件统一交给父类进行处理
    return QObject::eventFilter(object, event);
}
